/*******************************************************************************
 * 版权：北京润尼尔网络科技有限公司，保留所有版权<br>
 * 版本：v1.0.0<br>
 * 文件：UIComposite.js<br>
 * 日期：2016年8月1日<br>
 * 作者: 王志远<br>
 * 功能：界面组件<br>
 * 
 * 修改记录：<br>
 * 日期 描述 更新功能<br>
 ******************************************************************************/
window.makeNamespace(window,"Rainier.UI.V2");

/**
 * 类型名称：Rainier.UI.V2.UIComposite<br>
 * 类型功能：UI组件根节点<br>
 * 接口函数：<br>
 * getElementId			获取HTMLElementID号
 * getProperties		获取HTML属性值
 * addChildComposite	添加子组件
 * 成员变量：<br>
 */
Rainier.UI.V2.UIComposite = Rainier.Basic.CompositeObject.extend({
	
	NAME : "Rainier.UI.V2.UIComposite",
	
	/**
	 * 函数名称：Rainier.UI.V2.UIComposite.init<br>
	 * 函数功能：构造函数<br>
	 * 参数输入：objParentComposite  	父组件实例<br>
	 * 参数输入：objProperties		 	组件属性定义<br>	
	 * 异常信息：<br>
	 */
	init : function(objParentComposite,objProperties){
		
		if(!objParentComposite){
			throw new Error("no parent composite set.");
		}
		
		if(!objProperties){
			throw new Error("no composite properties set.");
		}
		
		//初始化组件
		this._super();					
		this.m_objProperties = objProperties;
		this.m_objProperties.id = this.getUuid();
		
		//定义组件的工具列表
		this.m_aToolList = [];
		
		//定义组件的事件列表
		this.m_aEventList = [];
		
		//定义组件的事件侦听器列表
		this.m_aEventListenerList = {};
		
		//添加事件代理
		this.appendEventHandler();

		this.elementId 	= null;
		
		//建立父子关系
		if(objParentComposite instanceof Rainier.UI.V2.UIComposite){
			objParentComposite.addChild(this.getUuid(),this);//建立类结构的父子关系
			var eleParent = objParentComposite.getElement();//建立HTML元素的父子联系
			this.createComposite(eleParent);
		}else{
			this.setParent(null);
			this.createComposite(objParentComposite);
		}
	},
	
	/**
	 * 函数名称：Rainier.UI.V2.UIComposite.appendEventHandler<br>
	 * 函数功能：添加事件代理<br>
	 * 函数返回：无<br>
	 * 异常信息：<br>
	 */
	appendEventHandler : function(){
		
		var obj = this;
		var eventAdapterFunc = this.eventAdapter;
		var pros = this.m_objProperties;
		for (var i = 0; i < this.m_aEventList.length; i++) {
			var event = this.m_aEventList[i];
			(function(event){
				pros[event] = function(){
					return eventAdapterFunc(event,event,obj,arguments);
		        };
			})(event);
		}
	},
	
	/**
	 * 函数名称：Rainier.UI.V2.UIComposite.callUiMethod<br>
	 * 函数功能：添加事件代理<br>
	 * 参数输入：sMethod 方法名称
	 * 参数输入：objArgs 方法参数
	 * 函数返回：无<br>
	 * 异常信息：<br>
	 */
	callUiMethod : function(sMethod,objArgs){
		
	},
	
	/**
	 * 函数名称：Rainier.UI.V2.UIComposite.CreateElement<br>
	 * 函数功能：创建HTMLElement<br>
	 * 参数输入：Element名称
	 * 参数输入：eleId ElementId号
	 * 参数输入：className class属性
	 * 参数输入：attrs 元素属性
	 * 异常信息：<br>
	 */
	CreateElement : function(eleName,eleId,className,attrs){
		var element = $('<'+eleName+'></'+eleName+'>');
		if (eleId) {
			element.attr('id',eleId);
		}
		if(className){
			element.addClass(className);					
		}
		if (attrs) {
			for(var attr in attrs){
				element.attr(attr,attrs[attr]);
			}
		}
		return element;
	},
	
	/**
	 * 函数名称：Rainier.UI.V2.UIComposite.buildProperties<br>
	 * 函数功能：构建组件属性类<br>
	 * 函数返回：m_objProperties<br>
	 * 异常信息：<br>
	 */
	buildProperties : function(){
		if(this.m_aToolList.length > 0){
			this.m_objProperties.tools = [];
			for(var i=0; i<this.m_aToolList.length; i++){
				var obj = {};
				var tool= this.m_aToolList[i];
				obj.iconCls = tool.getIconClass();
				obj.handler = tool.getHandler();
				this.m_objProperties.tools.push(obj);
			}
		}
	},
	
	/**
	 * 函数名称：Rainier.UI.V2.UIComposite.createComposite<br>
	 * 函数功能：创建组件<br>
	 * 函数返回：无<br>
	 * 异常信息：无<br>
	 */
	createComposite : function(eleParent){
		this.buildProperties();
	},
	
	/**
	 * 函数名称：Rainier.UI.V2.UIComposite.eventAdapter<br>
	 * 函数功能：组件事件代理<br>
	 * 参数输入：sEventListener    事件侦听器名称<br>
	 * 参数输入：sEvent 			事件类型<br>
	 * 参数输入：objEventSource		事件源<br>
	 * 参数输入：objArgs			事件参数<br>
	 * 参数输出：<br>
	 * 函数返回：<br>
	 * 异常信息：<br>
	 */
	eventAdapter : function(sEventListener,sEvent,objEventSource,objArgs){
		var listener = objEventSource.m_aEventListenerList[sEventListener];
		if(listener){
			return listener.onEvent(sEvent,objEventSource,objArgs);
		}
	},
	
	/**
	 * 函数名称：Rainier.UI.V2.UIComposite.registerEventListener<br>
	 * 函数功能：注册事件侦听器<br>
	 * 参数输入：sEvent 需要监听的事件<br>
	 * 参数输入：objEventLisener 事件侦听器<br>
	 * 参数输出：<br>
	 * 函数返回：<br>
	 * 异常信息：<br>
	 */
	registerEventListener : function(sEvent,objEventLisener){
		this.m_aEventListenerList[sEvent] = objEventLisener;
	},
	
	/**
	 * 函数名称：Rainier.UI.V2.UIComposite.registerTool<br>
	 * 函数功能：注册工具<br>
	 * 参数输入：objTool 工具<br>
	 * 函数返回：无<br>
	 * 异常信息：无<br>
	 */
	registerTool : function(objTool){
		this.m_aToolList.push(objTool);
	},
		
	/**
	 * 函数名称：Rainier.UI.V2.UIComposite.getElementId<br>
	 * 函数功能：获取当前对象的元素节点<br>
	 * 参数输出：当前节点对象<br>
	 * 函数返回：无<br>
	 * 异常信息：无<br>
	 */
	getElement : function(){
		return $("#"+this.getUuid());
	},
	
	/**
	 * 函数名称：Rainier.UI.V2.UIComposite.getProperties<br>
	 * 函数功能：获取组件HTML元素属性<br>
	 * 函数返回：m_properties : {id:xxxx-xxxx-xxx-xxx,class:....}<br>
	 * 异常信息：无<br>
	 */
	getProperties : function(){
		return this.m_objProperties;
	},
	
	/**
	 * 函数名称：Rainier.UI.V2.UIComposite.setProperty<br>
	 * 函数功能：设置组件属性<br>
	 * 参数输入：sProperty 属性名称<br>
	 * 参数输入：sValue    属性值<br>
	 * 函数返回：无<br>
	 * 异常信息：无<br>
	 */
	setProperty : function(sProperty,sValue){
		this.m_objProperties[sProperty] = sValue;
		var ele = this.getElement();
		ele[sProperty] = sValue;
	},

	/**
     * 函数名称：com.rainier.easyuiex.UIComposite.setOption<br>
     * 函数功能：设置选项值<br>
     * 参数输入：option String 选项<br>
     * 参数输入：value Object 选项值<br>
     * 函数返回：无<br>
     * 异常信息：无<br>
     */
    setOption : function(option, value) {
        var options = $.extend(true, {}, this.getOptions());
        options[option] = value;
        this.refreshOptions(options);
    },

    /**
     * 函数名称：com.rainier.easyuiex.UIComposite.getOption<br>
     * 函数功能：获取选项值<br>
     * 参数输入：option String 选项<br>
     * 函数返回：Object 选项值<br>
     * 异常信息：无<br>
     */
    getOption : function(option) {
        var options = this.getOptions();
        if (options[option]) {
            return options[option];
        } else {
            return null;
        }
    },

    /**
     * 函数名称：com.rainier.easyuiex.UIComposite.getOptions<br>
     * 函数功能：获取选项值<br>
     * 函数返回：Object 选项JSON对象<br>
     * 异常信息：无<br>
     */
    getOptions : function() {
    	//交由子类实现
    	//这是一个坑 慎入！
    	throw new Error('子类未继承该方法');
    },

    /**
     * 函数名称：com.rainier.easyuiex.UIComposite.refreshOptions<br>
     * 函数功能：重新刷新选项<br>
     * 参数输入：options Object 选项JSON对象<br>
     * 函数返回：无<br>
     * 异常信息：无<br>
     */
    refreshOptions : function(options) {
    	//交由子类实现
    	//这是一个坑 慎入！
    	throw new Error('子类未继承该方法');
    },
});